2005年05月08日
川俣晶の縁側ソフトウェア技術雑記 total 8249 count

.NET FrameworkのDrawImageメソッドでピクセル等倍での描画を強制する方法

Written By: 川俣 晶連絡先

 どうせ後で忘れるので自分用にメモっておこう。

 サンプルコードは、都合によりりManaged C++です。

DrawImageメソッドの自動スケーリング §

 System::Drawing::Graphics::DrawImageメソッドは、画像を描画します。

 その際、画像データが持つ解像度情報を参照し、自動的に適切なサイズにスケーリングを行います。つまり、以下のようなコードで描画を行うと、300dpiとして作成した画像ファイルを72dpi扱いの画面に表示させると、ピクセル等倍ではなく縮小されます。

System::Drawing::Rectangle srcRect(画像のピクセルサイズそのものを指定);

g->DrawImage(p->image,0,0,srcRect,System::Drawing::GraphicsUnit::Pixel);

DrawImageUnscaledメソッドの自動スケーリング §

 DrawImageと並んで、DrawImageUnscaledメソッドが存在しますが、Unscaledという言葉にピクセル等倍を期待しても裏切られます。ここでいうUnscaledとは見かけ上のサイズ変更しないことであり、それを達成するために画像の拡大縮小が行われます。

ピクセル等倍を堅持するには §

 結論から言えば、描画側に対して、どのサイズで描いて欲しいのかを明示することで、ピクセル等倍の描画を実現できます。

 一例を以下に示します。

System::Drawing::Rectangle targetRect(画像のピクセルサイズそのものを指定);

g->DrawImage(p->image,targetRect,targetRect,System::Drawing::GraphicsUnit::Pixel);

 このコードと、上手く行かなかったコードの相違点は、描画側を座標のみ示すか、矩形(座標+サイズ)を示すかの相違です。

感想 §

 昔ながらのWindows APIに慣れすぎて、とりあえずBitBltで等倍転送。拡大縮小は特別にStretchBltを使う……とすり込まれた人(つまり私)は要注意ですね。

 え? そんな人はもはや滅多にいない? 失礼しました~。